home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The 640 MEG Shareware Studio 2
/
The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO
/
clang
/
nn.zip
/
NEWS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-12-31
|
5KB
|
256 lines
#include "config.h"
#include "news.h"
export retry_on_error = 0;
FILE *open_news_article(art, modes, buffer1, buffer2)
article_header *art;
int modes;
news_header_buffer buffer1, buffer2;
{
char *body;
char *digest_buffer;
char *parse_header(), **art_hdr_field();
struct stat statb;
int retry;
FILE *f;
#ifdef NNTP
FILE *nntp_get_article();
#endif /* NNTP */
if (art->flag & A_FOLDER) {
f = open_file(group_path_name, OPEN_READ);
if (f == NULL) return NULL;
fseek(f, art->hpos, 0);
#ifdef NNTP
} else
if (use_nntp) {
f = nntp_get_article(art->a_number);
if (f == NULL) return NULL;
#endif /* NNTP */
} else {
sprintf(group_file_name, "%d", art->a_number);
retry = retry_on_error;
while ((f = open_file(group_path_name, OPEN_READ)) == NULL)
if (--retry < 0) return NULL;
/* necessary because empty files wreak havoc */
if (fstat(fileno(f), &statb) < 0 ||
statb.st_size < art->lpos || statb.st_size <= (off_t)0) {
fclose(f);
return NULL;
}
}
digest_buffer = buffer1;
if (modes & FILL_NEWS_HEADER) {
news.ng_from = NULL;
news.ng_reply = NULL;
news.ng_name = NULL;
news.ng_subj = NULL;
news.ng_groups = NULL;
news.ng_ref = NULL;
news.ng_bref = NULL;
news.ng_xlines = NULL;
if (modes & GET_ALL_FIELDS) {
news.ng_path = NULL;
news.ng_reply = NULL;
news.ng_ident = NULL;
news.ng_follow = NULL;
news.ng_keyw = NULL;
news.ng_dist = NULL;
news.ng_org = NULL;
news.ng_appr = NULL;
news.ng_summ = NULL;
news.ng_date = NULL;
news.ng_rdate = NULL;
}
if (modes & GET_DATE_ONLY)
news.ng_date = NULL;
body = parse_header(f, art_hdr_field, modes, buffer1);
news.ng_lines = news.ng_xlines ? atoi(news.ng_xlines) : -1;
if (modes & FILL_OFFSETS) {
art->fpos = news.ng_fpos = ftell(f);
fseek(f, (off_t)0, 2);
news.ng_lpos = ftell(f);
}
news.ng_flag = 0;
if (news.ng_appr) news.ng_flag |= N_MODERATED;
if (modes & DIGEST_CHECK && is_digest(body))
news.ng_flag |= N_DIGEST;
digest_buffer = buffer2;
}
if (modes & FILL_DIGEST_HEADER) {
fseek(f, art->hpos, 0);
parse_digest_header(f, modes & GET_ALL_FIELDS, digest_buffer);
}
fseek(f, (modes & SKIP_HEADER) ? art->fpos : art->hpos, 0);
return f;
}
char *parse_header(f, hdr_field, modes, hdrbuf)
FILE *f;
char **(*hdr_field)();
int modes;
news_header_buffer hdrbuf;
{
register char *bp, **fptr;
int siz, all, date_only;
off_t pos;
pos = ftell(f);
/* read first NEWS_HEADER_BUFFER bytes (should be more than enough) */
all = modes & GET_ALL_FIELDS;
date_only = modes & GET_DATE_ONLY;
siz = fread(hdrbuf, sizeof(char), NEWS_HEADER_BUFFER, f);
bp = hdrbuf;
bp[siz-1] = NUL;
/* decode subarticle header */
while (*bp) {
if (*bp == NL) { /* empty line following header */
++bp;
fseek(f, pos + (bp - hdrbuf), 0);
return bp;
}
if (*bp == SP) { /* for comp.ai.neural-nets digests */
bp++; /* which have <NL><space><NL> after header */
continue;
}
if (date_only && *bp != 'D')
fptr = NULL;
else
if (fptr = (*hdr_field)(bp, all)) {
while (*bp && *bp != ':' && isascii(*bp) && !isspace(*bp))
bp++;
bp++;
while (*bp && isascii(*bp) && isspace(*bp) && *bp != NL) bp++;
*fptr = bp;
}
while (*bp && *bp != NL) bp++;
if (fptr && bp == *fptr) *fptr = NULL;
if (*bp) *bp++ = NUL;
}
return bp;
}
static char **art_hdr_field(lp, all)
register char *lp;
int all;
{
#define check(name, lgt, field) \
if (strncmp(name, lp, lgt) == 0) return &news.field
switch (*lp++) {
case 'A':
if (!all) break;
check("pproved: ", 9, ng_appr);
break;
case 'B':
check("ack-eferences: ",15, ng_bref);
break;
case 'D':
check("ate: ", 5, ng_date);
if (!all) break;
check("ate-Received: ", 14, ng_rdate);
check("istribution: ", 13, ng_dist);
break;
case 'F':
check("rom: ", 5, ng_from);
if (!all) break;
check("ollowup-To: ", 12, ng_follow);
break;
case 'K':
if (!all) break;
check("eywords: ", 9, ng_keyw);
break;
case 'L':
check("ines: ", 6, ng_xlines);
break;
case 'M':
if (!all) break;
check("essage-ID: ", 11, ng_ident);
break;
case 'N':
check("ewsgroups: ", 11, ng_groups);
break;
case 'O':
if (!all) break;
check("rganization: ", 13, ng_org);
check("rganisation: ", 13, ng_org);
break;
case 'P':
if (!all) break;
check("ath: ", 5, ng_path);
break;
case 'R':
check("eply-To: ", 9, ng_reply);
check("eferences: ", 11, ng_ref);
break;
case 'S':
check("ubject: ", 8, ng_subj);
if (news.ng_from == NULL)
check("ender: ", 7, ng_from);
if (!all) break;
check("ummary: ", 8, ng_summ);
break;
case 'T':
check("itle: ", 6, ng_subj);
break;
}
return NULL;
#undef check
}
is_header_line(line)
char *line;
{
return art_hdr_field(line, 0) != (char **)NULL;
}